      <h1 class="entry-title entry-title-single" itemprop="headline">ABAP 开发系列(03): ABAP Selection Screens</h1>

    <div class="entry-content entry-content-single entry-content-aside" itemprop="text">
      <p>用户与<span class='wp_keywordlink'><a href="http://www.sapjx.com/tag/sap" title="SAP" target="_blank">SAP</a></span>数据之间的通信交互是通过对屏幕的操作来实现的，如：数据报表，业务功能操作等，而<span class='wp_keywordlink'><a href="http://www.sapjx.com/tag/sap" title="SAP" target="_blank">SAP</a></span>的屏幕开发一般分为两种：</p>
<p>1.  通过<span class='wp_keywordlink_affiliate'><a href="http://www.sapjx.com/tag/sap" title="查看SAP中的全部文章" target="_blank">SAP</a></span> <span class='wp_keywordlink'><a href="http://www.sapjx.com/tag/sap-abap" title="ABAP" target="_blank">ABAP</a></span>语法创建屏幕元素，称之为<span class='wp_keywordlink_affiliate'><a href="http://www.sapjx.com/tag/selection-screen" title="查看Selection Screen中的全部文章" target="_blank">Selection Screen</a></span>（选择屏幕）；</p>
<p>2.  通过<span class='wp_keywordlink_affiliate'><a href="http://www.sapjx.com/tag/sap" title="查看SAP中的全部文章" target="_blank">SAP</a></span>的屏幕编辑器开发，称之为Dialog（对话框屏幕），通过屏幕编辑器可以实现数据的多种展现模式。</p>
<p><img src="http://www.sapjx.com/wp-content/uploads/2014/02/abap_03_Selection_Screen.png" alt="abap_03_Selection_Screen" width="676" height="437" class="alignnone size-full wp-image-466" /></p>
<p>本文主要 讲述的是第一种屏幕开发的内容（选择屏幕）：</p>
<p>1. 屏幕基本元素</p>
<p>2. 屏幕输入值控制</p>
<p>3. 屏幕事件（<span class='wp_keywordlink'><a href="http://www.sapjx.com/tag/sap-abap" title="ABAP" target="_blank">ABAP</a></span> Event）</p>
<p>4. 屏幕对象的F1/F4功能</p>
<p>5. <span class='wp_keywordlink_affiliate'><a href="http://www.sapjx.com/tag/sap" title="查看SAP中的全部文章" target="_blank">SAP</a></span>屏幕框架</p>
<p><span id="more-127"></span></p>
<p>&nbsp;</p>
<h2>1.屏幕基本元素</h2>
<p>选择屏幕的开发有两种屏幕元素来创建数据输入域，分别是：<b><i>PARAMETERS </i></b>和 <b><i>SELECT-OPTIONS</i></b>。</p>
<p>两者区别在于，前者只能通过单值（单个数据）输入，后者通过内表形式实现多值（一行或多行数据）输入。</p>
<h3>1.1  PARAMETERS 对象及其属性</h3>
<p><img src="http://www.sapjx.com/wp-content/uploads/2014/02/abap_03_Parameters.png" alt="abap_03_Parameters" width="503" height="386" class="alignnone size-full wp-image-467" /></p>
<p>通过上面的预览图，我们看下<span class='wp_keywordlink'><a href="http://www.sapjx.com/tag/sap-abap" title="ABAP" target="_blank">ABAP</a></span>程序：</p>
<pre class="brush: abap;">PARAMETERS: pa_oarr LIKE sflight-carrid,
            pa_name AS CHECKBOX DEFAULT 'X',
            pa_curr AS CHECKBOX DEFAULT 'X',
            pa_lim1 RADIOBUTTON GROUP   lim,
            pa_lim2 RADIOBUTTON GROUP   lim,
            pa_lim3 RADIOBUTTON GROUP   lim.</pre>
<p>&nbsp;</p>
<p><b>PARAMETERS 对象语法：</b></p>
<p><img src="http://www.sapjx.com/wp-content/uploads/2014/02/abap_03_Parameters_Syntax.png" alt="abap_03_Parameters_Syntax" width="652" height="76" class="alignnone size-full wp-image-468" /></p>
<ul>
<li><b>&lt;f&gt;</b>  是用户自定义对象名，即程序中的 pa_oarr, pa_name 等。</li>
<li><b>TYPE|LIKE</b>  是定义对象名的类型</li>
<li><b>DECIMALS</b>  用于数量型对象，保留多少位小数点</li>
<li><b>MEMROY ID</b>  SAP内存ID，可以将对象参数临时保存在内存中，通过&lt;pid&gt;存储及读取，长度不能超过3个字符</li>
<li><b>OBLIGATORY</b> 必输项，该对象在屏幕上指定必输</li>
<li><b>DEFAULT</b> 默认值</li>
<li><b>AS CHECKBOX</b>  将对象设置成复选框方式交互，如上面截图中的 PA_NAME对象</li>
<li><b>RADIOBUTTON GROUP</b>  将对象设置成单选框交互，由于单选框只能集合中的一个，故需要指定一个GROUP 限制其集合，</li>
</ul>
<p>如上面截图中的PA_LIM1、PA_LIM2等</p>
<p>以上参数，都可以直接在 <b>PARAMETERS</b> 上配置。</p>
<p>&nbsp;</p>
<h3>1.2  SELECT-OPTIONS 对象及其属性</h3>
<p><img src="http://www.sapjx.com/wp-content/uploads/2014/02/abap_03_Select-Options.png" alt="abap_03_Select-Options" width="669" height="131" class="alignnone size-full wp-image-470" /></p>
<p>通过上面的预览图，我们看下简单的ABAP程序：</p>
<pre class="brush: abap;">REPORT  zsapjx_03. 
TABLES: sflight.

SELECT-OPTIONS: so_carr FOR sflight-carrid DEFAULT 'AA',
                so_fldt FOR sflight-fldate.</pre>
<p>&nbsp;</p>
<p><span style="line-height: 1.5em;">可以看到界面上一行会出现两个文本框（输入域），这里我们称之为“上限”和“下限”。</span></p>
<p>例如，从 1 到9的区间，从A到Z的区间等范围。</p>
<p><b>SELECT-OPTIONS对象语法：</b></p>
<p><img src="http://www.sapjx.com/wp-content/uploads/2014/02/abap_03_Select-Options_Syntax.png" alt="abap_03_Select-Options_Syntax" width="575" height="305" class="alignnone size-full wp-image-469" /></p>
<ul>
<li><b>&lt;seltab&gt;</b>  创建自定义对象名</li>
<li><b>FOR</b> 参考对象，一般用系统本身的数据表结构对象</li>
<li><b>DEFAULT</b>  默认值</li>
<li><b>MEMORY ID</b>  内存ID ，与PARAMETERS用法一致</li>
<li><b>LOWER CASE</b> 大写，输入的内容必须大写</li>
<li><b>OBLIGATORY</b>  必输项，与PARAMETERS用法一致，只是SELECT-OPTIONS 只限于<b>LOW</b><b>字段值</b>（<span style="text-decoration: underline;">见下面第</span><span style="text-decoration: underline;">2</span><span style="text-decoration: underline;">节</span>）</li>
<li><b>NO-EXTENSION</b> 限制只能输入一行数据</li>
<li><b>NO INTERVALS</b>  限制只能输入一个单元（LOW字段）</li>
</ul>
<p>以上参数，都可以直接在 <b>SELECT-OPTIONS</b>上配置。例如：</p>
<pre class="brush: abap;">SELECT-OPTIONS: so_carr FOR sflight-carrid DEFAULT 'AA',
                so_fldt FOR sflight-fldate OBLIGATORY NO INTERVALS NO-EXTENSION.</pre>
<p>效果：</p>
<p><img src="http://www.sapjx.com/wp-content/uploads/2014/02/abap_03_Select-Options_Demo.png" alt="abap_03_Select-Options_Demo" width="669" height="133" class="alignnone size-full wp-image-471" /></p>
<p>&nbsp;</p>
<p><span style="line-height: 1.5em;">这时，就会在输入域多出了一个提示必输的√，下限输入域、多值都被隐藏了。</span></p>
<p><i style="color:red;">提示: 在编程过程中，ABAP 编辑器会给出相关的参数智能提示:</i></p>
<p><img class="alignnone size-full wp-image-132" alt="abap_03_Select-Options_Intel" src="http://www.sapjx.com/wp-content/uploads/2014/02/abap_03_Select-Options_Intel.png" width="535" height="47" /></p>
<p>&nbsp;</p>
<h2>2. 屏幕输入值控制</h2>
<p>双击屏幕某字段时，会弹出维护选择项的界面：</p>
<p><img src="http://www.sapjx.com/wp-content/uploads/2014/02/abap_03_Select-Options_Maintance_Operation.png" alt="abap_03_Select-Options_Maintance_Operation" width="278" height="404" class="alignnone size-full wp-image-473" /></p>
<p>点击多值输入按钮<img class="alignnone size-full wp-image-129" alt="abap_03_Select-Options_Extension_Icon" src="http://www.sapjx.com/wp-content/uploads/2014/02/abap_03_Select-Options_Extension_Icon.png" width="32" height="23" />时，会弹出多值输入界面：</p>
<p><img src="http://www.sapjx.com/wp-content/uploads/2014/02/abap_03_Select-Options_Maintance_Single_Value.png" alt="abap_03_Select-Options_Maintance_Single_Value" width="750" height="382" class="alignnone size-full wp-image-474" /></p>
<p>（单一值标签界面）</p>
<p>&nbsp;</p>
<p><img src="http://www.sapjx.com/wp-content/uploads/2014/02/abap_03_Select-Options_Maintance_Multiplicity_Value.png" alt="abap_03_Select-Options_Maintance_Multiplicity_Value" width="750" height="382" class="alignnone size-full wp-image-475" /></p>
<p>（多值标签界面）</p>
<p>&nbsp;</p>
<p>这些都是为了筛选数据，或者输入多值区间的操作。</p>
<p>前面我们提到 Select-options 跟 <span class='wp_keywordlink_affiliate'><a href="http://www.sapjx.com/tag/parameters" title="查看Parameters中的全部文章" target="_blank">Parameters</a></span> 的区别在于 Select-options 是用内表形式存储输入值的。</p>
<p>Select-options内表中的结构如下表所示：</p>
<p><img class="alignnone size-full wp-image-131" alt="abap_03_Select-Options_Innertable_Struct" src="http://www.sapjx.com/wp-content/uploads/2014/02/abap_03_Select-Options_Innertable_Struct.png" width="276" height="72" /></p>
<p>&nbsp;</p>
<p><b>Sign</b><b>栏位</b>，表示输入值的类型， I(Include)或者 E(Exclude) ，包括与不包括（即：排除）；</p>
<p>在维护选择项时，可以通过 <img class="alignnone size-full wp-image-136" alt="abap_03_Select-Options_Maintance_Operation_Sign_Select" src="http://www.sapjx.com/wp-content/uploads/2014/02/abap_03_Select-Options_Maintance_Operation_Sign_Select.png" width="157" height="21" />按钮来筛选操作；</p>
<p>&nbsp;<br />
<b>Option</b><b>栏位</b>，表示输入值的关系：</p>
<ul>
<li>EQ(Equal) &#8211; 等于</li>
<li>NE(Not Equal) &#8211; 不等于</li>
<li>LT(Little Than) &#8211; 小于</li>
<li>LE(Little and Equal) &#8211; 小于等于</li>
<li>GT(Great Than) &#8211; 大于</li>
<li>GE(Greater and Equal ) &#8211; 大于等于</li>
<li>BT(Between) &#8211; 上下限之间</li>
<li>NB(Not Between) &#8211; 不在上下限之间</li>
</ul>
<p>在选择维护项中，可以通过选择操作符筛选条件：</p>
<p><img class="alignnone size-full wp-image-135" alt="abap_03_Select-Options_Maintance_Operation_Option_Select" src="http://www.sapjx.com/wp-content/uploads/2014/02/abap_03_Select-Options_Maintance_Operation_Option_Select.png" width="101" height="115" /></p>
<p>&nbsp;</p>
<p><b>LOW  </b><b>栏位</b>，输入值上限</p>
<p>&nbsp;<br />
<b>HIGH</b><b>栏位</b>，输入值下限</p>
<p>除了可以通过屏幕操作来筛选条件之外，程序上也可以控制 Select-options 的输入值，</p>
<p>可以在初始化事件中添加相关程序：</p>
<pre class="brush: abap;">REPORT  zsapjx_03.

TABLES: sflight.

SELECT-OPTIONS: so_carr FOR sflight-carrid,
                so_fldt FOR sflight-fldate.

*--------------------------------------------------------------------*
* 初始化
*--------------------------------------------------------------------*
INITIALIZATION.
  so_carr-sign   = 'I'.
  so_carr-option = 'EQ'.
  so_carr-low    = 'AA'.
  so_carr-high   = 'ZZ'.
  APPEND so_carr TO so_carr.
  CLEAR so_carr.</pre>
<p><span style="line-height: 1.5em;">执行效果：</span></p>
<p><img src="http://www.sapjx.com/wp-content/uploads/2014/02/abap_03_Select-Options_Initializtion_Demo.png" alt="abap_03_Select-Options_Initializtion_Demo" width="659" height="116" class="alignnone size-full wp-image-476" /></p>
<p>&nbsp;</p>
<h2>3. 屏幕事件（<span class='wp_keywordlink_affiliate'><a href="http://www.sapjx.com/tag/abap-event" title="查看ABAP Event中的全部文章" target="_blank">ABAP Event</a></span>）</h2>
<p>SAP屏幕事件也叫ABAP事件，R/3系统的运行机制中，SAP程序的执行都是通过事件来驱动的。</p>
<p>SAP程序的事件流：</p>
<p><img src="http://www.sapjx.com/wp-content/uploads/2014/02/abap_03_ABAP_Event.png" alt="abap_03_ABAP_Event" width="528" height="1193" class="alignnone size-full wp-image-478" /></p>
<p>再来看下程序中，事件的执行：</p>
<pre class="brush: abap;">REPORT  zsapjx_03.

TABLES: mara.

SELECT-OPTIONS: so_matnr FOR mara-matnr.
PARAMETERS: pa_matnr type mara-matnr.

DATA: gv_init   TYPE string,
      gv_output TYPE string,
      gv_start  TYPE string,
      gv_end    TYPE string.

INITIALIZATION.
  gv_init   = '01.INITIALIZATION 事件'.

AT SELECTION-SCREEN OUTPUT.
  gv_output = '02.AT SELECTION-SCREEN OUTPUT 事件'.

START-OF-SELECTION.
  gv_start  = '03.START-OF-SELECTION 事件'.

END-OF-SELECTION.
  gv_end    = '04.END-OF-SELECTION 事件'.

  WRITE: /.
  WRITE: / gv_init.
  WRITE: / gv_output.
  WRITE: / gv_start.
  WRITE: / gv_end.
  WRITE: /.</pre>
<p><span style="line-height: 1.5em;">运行结果：</span></p>
<p><img src="http://www.sapjx.com/wp-content/uploads/2014/02/abap_03_ABAP_Event_Demo.png" alt="abap_03_ABAP_Event_Demo" width="374" height="125" class="alignnone size-full wp-image-477" /></p>
<p>&nbsp;</p>
<p>从上面的事件流及程序中看到，SAP的事件包括：</p>
<h4>3.1 INITIALIZATION 事件</h4>
<p>该事件在屏幕未显示之前执行，可对程序设置值及屏幕元素进行初始化设置</p>
<p>&nbsp;</p>
<h4>3.2 AT SELECTION-SCREEN OUTPUT 事件</h4>
<p>屏幕元素声明完成后执行，并会在程序执行之前优先检查该事件下的所有代码。<br />
通常用于对输入值校验数据，如库存是否充足，操作类型是否允许等。</p>
<p>&nbsp;</p>
<h4>3.3 AT SELECTION-SCREEN ON … 事件</h4>
<p>可在程序执行之前指定输入值的校验，与AT SELECTION-SCREEN OUTPUT事件类似；<br />
只是OUTPUT事件检查屏幕输入值的校验，而ON 事件则是检查指定的输入值。<br />
执行该事件时，其它输入域的输入状态会被锁定。</p>
<h4>3.3.1 AT SELECTION-SCREEN ON VALUE REQUEST FOR {para|selcrit-low|selcrit-high}  (F4)</h4>
<p>指定输入域F4搜索帮助的事件，用于实现屏幕输入域的自定义F4搜索帮助。</p>
<p>&nbsp;</p>
<h4>3.3.2 AT SELECTION-SCREEN ON HELP REQUEST FOR {para|selcrit-low|selcrit-high}    (F1)</h4>
<p>指定输入域F1帮助的事件，用于实现屏幕输入域的自定义F1帮助。</p>
<p>&nbsp;</p>
<h4>3.3.3 AT SELECTION-SCREEN ON {para|selcrit}</h4>
<p>指定输入域输入值时触发，可以是<span class='wp_keywordlink_affiliate'><a href="http://www.sapjx.com/tag/parameters" title="查看Parameters中的全部文章" target="_blank">Parameters</a></span>对象，也可以是Select-options对象。</p>
<p>&nbsp;</p>
<h4>3.3.4 AT SELECTION-SCREEN ON BLOCK (block)</h4>
<p>该事件应用于设定框架的屏幕中。</p>
<p>&nbsp;</p>
<h4>3.3.5 AT SELECTION-SCREEN ON RADIOBUTTON  GROUP (radi)</h4>
<p>该事件应用于单选框按钮组中。</p>
<p>&nbsp;</p>
<h4>3.3.6 AT SELECTION-SCREEN ON END OF (selcrit)</h4>
<p>该事件只应用于Select-options对象，Parameters对象不起作用。在输入域进行多行数据输入时触发。</p>
<p>&nbsp;</p>
<h4>3.4 AT SELECTION-SCREEN 事件</h4>
<p>与前面的 AT SELECTION-SCREEN OUTPUT 和AT SELECTION-SCREEN ON 事件类似，</p>
<p>区别在于执行顺序优先级低于前两者。</p>
<p>&nbsp;</p>
<h4>3.5 START-OF-SELECTION 事件</h4>
<p>开始执行，该事件在执行程序时触发：</p>
<p><img src="http://www.sapjx.com/wp-content/uploads/2014/02/abap_03_Start_Of_Selection_Event_Demo.png" alt="abap_03_Start_Of_Selection_Event_Demo" width="366" height="115" class="alignnone size-full wp-image-480" /></p>
<p>&nbsp;</p>
<h4>3.6 END-OF-SELECTION 事件</h4>
<p>该事件应用于所有数据处理完成后，即在START-OF-SELECTION执行完成后，但输出屏幕还未显示前。</p>
<p>&nbsp;</p>
<h2>4. 屏幕对象的 F1/F4 功能</h2>
<h3>4.1  屏幕对象的F1功能</h3>
<p>每个对象都能查看相应的系统帮助文档，将光标聚焦在对象上，然后按F1键，系统会弹出相应的标准系统帮助文档。</p>
<p>如，查看移动类型的F1帮助：</p>
<p><img src="http://www.sapjx.com/wp-content/uploads/2014/02/abap_03_F1.png" alt="abap_03_F1" width="500" height="474" class="alignnone size-full wp-image-482" /></p>
<p>而对于用户自定义的对象，则需要我们去添加相应的说明文档。</p>
<p>&nbsp;</p>
<h3>4.2 屏幕对象的F4功能</h3>
<p>F4功能叫Search Help(搜索帮助)，便于我们在输入值时从数据字典中筛选相关数据，起到智能提示的效果。</p>
<p>例如，在移动类型时，点击该输入域右边的小方框：</p>
<p><img class="alignnone size-full wp-image-146" alt="abap_03_F4_Screen" src="http://www.sapjx.com/wp-content/uploads/2014/02/abap_03_F4_Screen.png" width="423" height="189" /></p>
<p>会弹出相应的数据供用户选择输入：</p>
<p><img class="alignnone size-full wp-image-145" alt="abap_03_F4" src="http://www.sapjx.com/wp-content/uploads/2014/02/abap_03_F4.png" width="409" height="382" /></p>
<p>而用户自定义的对象，也需要我们去添加相应的Search Help 对象，相关内容会在ABAP数据字典章节中说明。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2><strong>5. SAP屏幕框架</strong></h2>
<p>屏幕框架主要是屏幕框线的设计，也就是BLOCK的应用。</p>
<p>BLOCK的语法：</p>
<p><img class="alignnone size-full wp-image-143" alt="abap_03_Block_Syntax" src="http://www.sapjx.com/wp-content/uploads/2014/02/abap_03_Block_Syntax.png" width="373" height="92" /></p>
<p>&nbsp;</p>
<p>例如，下面的程序：</p>
<pre class="brush: abap;">SELECTION-SCREEN BEGIN OF BLOCK carr WITH FRAME TITLE text-001.
SELECT-OPTIONS: so_carr FOR sflight-carrid,
                so_fldt FOR sflight-fldate.
SELECTION-SCREEN END OF BLOCK carr.

SELECTION-SCREEN BEGIN OF BLOCK limit WITH FRAME TITLE text-002.
PARAMETERS: pa_oarr LIKE sflight-carrid,
            pa_name AS CHECKBOX DEFAULT 'X',
            pa_curr AS CHECKBOX DEFAULT 'X',
            pa_lim1 RADIOBUTTON GROUP   lim,
            pa_lim2 RADIOBUTTON GROUP   lim,
            pa_lim3 RADIOBUTTON GROUP   lim.
SELECTION-SCREEN END OF BLOCK limit.</pre>
<p>执行的效果：</p>
<p><img src="http://www.sapjx.com/wp-content/uploads/2014/02/abap_03_Block_Demo.png" alt="abap_03_Block_Demo" width="663" height="271" class="alignnone size-full wp-image-483" /></p>
<p>屏幕上多出了框线，这是SAP屏幕框架的效果，不仅可以保证屏幕设计的美观效果，</p>
<p>还可以提供诸如按钮、页签(Tab)等功能组件。</p>